/**
爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢？

注意：给定 n 是一个正整数。


f(x) = f(x-1) + f(x-2);

--- 前往楼梯顶部的"最后一步"，要么跳1阶，要么跳2阶
--- 根据这个思路，假设我要跳3阶楼梯，只要把最后跳1阶即（前面跳2阶楼梯的方法数）加上最后跳2阶（前面跳1阶楼梯的方法数）不就可以了吗？

即跳n阶楼梯的方法数 = 跳n-1阶楼梯的方法数 + 跳n-2阶楼梯的方法数

它意味着爬到第 x 级台阶的方案数是爬到第 x−1 级台阶的方案数和爬到第 x−2 级台阶的方案数的和。很好理解，因为每次只能爬 1 级或 2 级，
所以 f(x) 只能从 f(x−1) 和 f(x−2) 转移过来，而这里要统计方案总数，我们就需要对这两项的贡献求和。

 */

class Solution {
    public int climbStairs(int n) {
        int p = 0, q = 0, r = 1;
        for (int i = 1; i <= n; ++i) {
            p = q; 
            q = r; 
            r = p + q;
        }
        return r;
    }
}